package com.corpgovernment.organization.util;

import com.ctrip.corp.obt.generic.utils.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class IdCardUtil {

    /**
     * 15位身份证号
     */
    private static final Integer FIFTEEN_ID_CARD=15;
    /**
     * 18位身份证号
     */
    private static final Integer EIGHTEEN_ID_CARD=18;

    private static final String MALE = "男";
    private static final String FEMALE = "女";
    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");


    /**
     * 根据身份证号获取性别
     * @param IDCard
     * @return
     */
    public static String getSex(String IDCard){
        String sex ="";
        if (StringUtils.isNotBlank(IDCard)){
            //15位身份证号
            if (IDCard.length() == FIFTEEN_ID_CARD){
                if (Integer.parseInt(IDCard.substring(14, 15)) % 2 == 0) {
                    sex = "女";
                } else {
                    sex = "男";
                }
                //18位身份证号
            }else if(IDCard.length() == EIGHTEEN_ID_CARD){
                // 判断性别
                if (Integer.parseInt(IDCard.substring(16).substring(0, 1)) % 2 == 0) {
                    sex = "女";
                } else {
                    sex = "男";
                }
            }
        }
        return sex;
    }

    /**
     * 根据身份证号获取年龄
     * @param IDCard
     * @return
     */
    public static Integer getAge(String IDCard){
        Integer age = 0;
        Date date = new Date();
        if (StringUtils.isNotBlank(IDCard)&& isValid(IDCard)){
            //15位身份证号
            if (IDCard.length() == FIFTEEN_ID_CARD){
                // 身份证上的年份(15位身份证为1980年前的)
                String uyear = "19" + IDCard.substring(6, 8);
                // 身份证上的月份
                String uyue = IDCard.substring(8, 10);
                // 当前年份
                String fyear = format.format(date).substring(0, 4);
                // 当前月份
                String fyue = format.format(date).substring(5, 7);
                if (Integer.parseInt(uyue) <= Integer.parseInt(fyue)) {
                    age = Integer.parseInt(fyear) - Integer.parseInt(uyear) + 1;
                    // 当前用户还没过生
                } else {
                    age = Integer.parseInt(fyear) - Integer.parseInt(uyear);
                    // 当前用户还没过生日
                }
            }
        }
        return age;
    }


    /**
     * 获取出生日期  yyyy年MM月dd日
     * @param IDCard
     * @return
     */
    public static String getBirthday(String IDCard){
        String birthday="";
        String year="";
        String month="";
        String day="";
        if (StringUtils.isNotBlank(IDCard)){
            //15位身份证号
            if (IDCard.length() == FIFTEEN_ID_CARD){
                // 身份证上的年份(15位身份证为1980年前的)
                year = "19" + IDCard.substring(6, 8);
                //身份证上的月份
                month = IDCard.substring(8, 10);
                //身份证上的日期
                day= IDCard.substring(10, 12);
                //18位身份证号
            }else if(IDCard.length() == EIGHTEEN_ID_CARD){
                // 身份证上的年份
                year = IDCard.substring(6).substring(0, 4);
                // 身份证上的月份
                month = IDCard.substring(10).substring(0, 2);
                //身份证上的日期
                day=IDCard.substring(12).substring(0,2);
            }
            birthday=year+"年"+month+"月"+day+"日";
        }
        return birthday;
    }


    /**
     * 身份证验证
     * @param id 号码内容
     * @return 是否有效
     */
    public static boolean isValid(String id){
        Boolean validResult = true;
        //校验长度只能为15或18
        int len = id.length();
        if (len != FIFTEEN_ID_CARD && len != EIGHTEEN_ID_CARD){
            validResult = false;
        }
        return validResult;
    }


    /**
     * 校验生日
     * @param id
     * @return
     */
    public static boolean validDate(String id, String birth)
    {
        if (StringUtils.isBlank(birth)) {
            return true;
        }
        try
        {
            String carBirth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            Date birthDate = sdf.parse(carBirth);
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            if (!birth.equals(simpleDateFormat.format(birthDate))){
                return false;
            }
        }
        catch (ParseException e)
        {
            return false;
        }
        return true;
    }

    /**
     * 获取性别
     * @param id
     * @return
     */
    public static String getGender(String id){
        char c;
        if (id.length() == FIFTEEN_ID_CARD) {
            c = id.charAt(id.length() - 1);
        }else {
            c = id.charAt(id.length() - 2);
        }
        return Character.getNumericValue(c) %2 == 0 ? FEMALE : MALE;
    }

    /**
     * 获取出生日期，格式:yyyy-mm-dd
     * @param id
     * @return
     */
    public static String getBirth(String id){
        StringBuilder sb = new StringBuilder();
        if (id.length() == FIFTEEN_ID_CARD){
            sb.append("19").append(id, 6, 8).append("-")
                    .append(id, 8, 10).append("-")
                    .append(id, 10, 12);
        }else{
            sb.append(id, 6, 10).append("-")
                    .append(id, 10, 12).append("-")
                    .append(id, 12, 14);
        }
        return sb.toString();
    }

    /**
     * 获取性别 M男性 F女性
     * @param id
     * @return
     */
    public static String getEnGender(String id){
        return MALE.equals(getGender(id)) ? "M" : "F";
    }
}
